package externalSort;

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.UUID;
import java.io.File;
import java.util.stream.Collectors;

public class fileNameGenerator {

    /**
     * 生成合并文件的短名称
     * @param file1 第一个文件路径
     * @param file2 第二个文件路径
     * @param outputDir 输出目录
     * @return 完整的输出文件路径
     */
    public static String generateMergeFileName(String file1, String file2, String outputDir) {
        // 从文件名中提取数字标识（假设你的文件名包含数字）
        int num1 = extractNumberFromFileName(file1);
        int num2 = extractNumberFromFileName(file2);

        // 使用范围表示法生成短文件名
        int min = Math.min(num1, num2);
        int max = Math.max(num1, num2);

        String shortName;
        if (max - min == 1) {
            // 如果是连续数字，使用范围表示
            shortName = String.format("merged_%d_to_%d.txt", min, max);
        } else {
            // 如果不连续，使用首尾数字
            shortName = String.format("merged_%d_%d.txt", min, max);
        }

        return outputDir + shortName;
    }

    /**
     * 生成合并文件的短名称 - 文件列表版本
     * @param filePairs 要合并的文件路径列表
     * @param outputDir 输出目录
     * @return 完整的输出文件路径
     */
    public static String generateMergeFileName(List<filePair> filePairs, String outputDir) {

        List<String> files=filePairs.stream().map(a->a.name).toList();

        if (files.isEmpty()) {
            throw new IllegalArgumentException("文件列表不能为空");
        }

        // 确保输出目录以分隔符结尾
        if (!outputDir.endsWith(File.separator)) {
            outputDir += File.separator;
        }

        // 从所有文件名中提取数字标识
        List<Integer> numbers = new ArrayList<>();
        for (String filePath : files) {
            int num = extractNumberFromFileName(filePath);
            numbers.add(num);
        }

        // 对数字进行排序
        Collections.sort(numbers);

        String shortName;
        if (numbers.size() == 1) {
            // 单个文件的情况
            shortName = String.format("merged_single_%d.txt", numbers.getFirst());
        } else if (isConsecutive(numbers)) {
            // 如果是连续数字，使用范围表示
            int min = numbers.getFirst();
            int max = numbers.getLast();
            shortName = String.format("merged_%d_to_%d.txt", min, max);
        } else {
            // 如果不连续，使用首尾数字和数量
            int min = numbers.getFirst();
            int max = numbers.getLast();
            int count = numbers.size();
            shortName = String.format("merged_%d_%d_%dfiles.txt", min, max, count);
        }

        return outputDir + shortName;
    }

    /**
     * 检查数字列表是否连续
     */
    private static boolean isConsecutive(List<Integer> numbers) {
        if (numbers.size() <= 1) {
            return true;
        }

        for (int i = 1; i < numbers.size(); i++) {
            if (numbers.get(i) - numbers.get(i - 1) != 1) {
                return false;
            }
        }
        return true;
    }

    /**
     * 从文件名中提取数字（根据你的实际文件名格式调整）
     */
    private static int extractNumberFromFileName(String filePath) {
        try {
            File file = new File(filePath);
            String fileName = file.getName();

            // 多种文件名格式支持：
            // part_833.txt, merged_832_834.txt, 833.txt, run_5.dat, buffer_123.data

            // 方法1: 提取所有数字，取最后一个（通常是最有意义的）
            String[] parts = fileName.split("[^0-9]+");
            List<Integer> numbers = new ArrayList<>();
            for (String part : parts) {
                if (!part.isEmpty()) {
                    numbers.add(Integer.parseInt(part));
                }
            }

            if (!numbers.isEmpty()) {
                // 返回最大的数字（通常是序列号）
                return Collections.max(numbers);
            }

        } catch (Exception e) {
            // 如果解析失败，使用备用方案
            System.err.printf("从文件名提取数字失败: %s - %s%n", filePath, e.getMessage());
        }

        // 备用方案：使用哈希值
        return Math.abs(filePath.hashCode() % 10000);
    }

    /**
     * 生成基于时间戳的文件名（备选方案）
     */
    public static String generateTimestampFileName(String outputDir) {
        if (!outputDir.endsWith(File.separator)) {
            outputDir += File.separator;
        }
        return outputDir + "merged_" + System.currentTimeMillis() + ".txt";
    }

    /**
     * 生成基于时间戳的文件名（带前缀）
     */
    public static String generateTimestampFileName(String outputDir, String prefix) {
        if (!outputDir.endsWith(File.separator)) {
            outputDir += File.separator;
        }
        return outputDir + prefix + "_" + System.currentTimeMillis() + ".txt";
    }

    /**
     * 生成基于UUID的文件名（备选方案）
     */
    public static String generateUUIDFileName(String outputDir) {
        if (!outputDir.endsWith(File.separator)) {
            outputDir += File.separator;
        }
        return outputDir + "merged_" + UUID.randomUUID().toString().substring(0, 8) + ".txt";
    }

    /**
     * 生成基于UUID的文件名（带前缀）
     */
    public static String generateUUIDFileName(String outputDir, String prefix) {
        if (!outputDir.endsWith(File.separator)) {
            outputDir += File.separator;
        }
        return outputDir + prefix + "_" + UUID.randomUUID().toString().substring(0, 8) + ".txt";
    }

    /**
     * 生成序列文件名（用于顺串生成）
     */
    public static String generateSequenceFileName(String outputDir, int sequenceNumber) {
        if (!outputDir.endsWith(File.separator)) {
            outputDir += File.separator;
        }
        return outputDir + String.format("run_%04d.txt", sequenceNumber);
    }

    /**
     * 生成最终排序结果文件名
     */
    public static String generateFinalOutputFileName(String outputDir) {
        if (!outputDir.endsWith(File.separator)) {
            outputDir += File.separator;
        }
        return outputDir + "sorted_final_output.txt";
    }
}